home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / setf.openwindow.e < prev    next >
Text File  |  1995-02-02  |  2KB  |  98 lines

  1. /* setf.OpenWindow.e -- a program to monitor Intuition OpenWindow calls */
  2.  
  3. OPT OSVERSION=37
  4.  
  5. MODULE 'dos/dos', 'exec/ports', 'exec/tasks', 'exec/nodes', 'exec/memory',
  6.        'intuition/intuition'
  7.  
  8. CONST OFFSET=$fda2  /* intuitionbase offset of OpenWindowTagList() */
  9.  
  10. OBJECT mymsg
  11.   msg:mn
  12.   s, t
  13. ENDOBJECT
  14.  
  15. DEF port:PTR TO mp
  16.  
  17. PROC main()
  18.   DEF ps, us, loop, sig, oldf
  19.   IF port:=CreateMsgPort()
  20.     Forbid()     /* Don't let anyone mess things up... */
  21.     IF oldf:=SetFunction(intuitionbase, OFFSET, {newf})
  22.       PutLong({patch}, oldf)
  23.       LEA store(PC), A0
  24.       MOVE.L A4, (A0)    /* Store the A4 register... */
  25.       Permit()    /* Now we can let everyone else back in */
  26.       ps:=Shl(1,port.sigbit)   /* Set up port and user signal bits */
  27.       us:=SIGBREAKF_CTRL_C
  28.       loop:=TRUE
  29.       WHILE loop
  30.         sig:=Wait(ps OR us)
  31.         IF sig AND ps
  32.           printmsgs()
  33.         ENDIF
  34.         IF sig AND us
  35.           loop:=FALSE
  36.         ENDIF
  37.       ENDWHILE
  38.       Forbid()   /* Paranoid... */
  39.       SetFunction(intuitionbase, OFFSET, oldf)
  40.     ENDIF
  41.     Permit()
  42.     printmsgs()   /* Make sure the port is empty */
  43.     DeleteMsgPort(port)
  44.   ENDIF
  45. ENDPROC
  46.  
  47. /* Nicely (?) print the messages out... */
  48. PROC printmsgs()
  49.   DEF msg:PTR TO mymsg
  50.   WHILE msg:=GetMsg(port)
  51.     WriteF('Task \l\s[25] opened window \r\s[20]\n',
  52.            IF msg.t THEN msg.t ELSE '*unnamed*',
  53.            IF msg.s THEN msg.s ELSE '*unnamed*')
  54.     ReplyMsg(msg)
  55.     DisposeLink(msg.s)
  56.     DisposeLink(msg.t)
  57.     Dispose(msg)
  58.   ENDWHILE
  59. ENDPROC
  60.  
  61. /* Send a message to the patching process */
  62. PROC sendmsg()
  63.   DEF msg:PTR TO mymsg, w:PTR TO nw, tsk:tc, l:ln
  64.   MOVE.L A0, w
  65.   MOVE.L A1, t
  66.   /* Allocate a new message */
  67.   msg:=New(SIZEOF mymsg)
  68.   IF w.title
  69.     msg.s:=String(StrLen(w.title))
  70.     StrCopy(msg.s, w.title, ALL)
  71.   ENDIF
  72.   tsk:=FindTask(NIL)   /* Find out who we are */
  73.   msg.t:=NIL
  74.   IF tsk
  75.     l:=tsk.ln
  76.     IF l AND l.name
  77.       msg.t:=String(StrLen(l.name))
  78.       StrCopy(msg.t, l.name, ALL)
  79.     ENDIF
  80.   ENDIF
  81.   PutMsg(port, msg)
  82. ENDPROC
  83.  
  84. /* Place to store A4 register */
  85. store:  LONG 0
  86. /* Place to store real call */
  87. patch:  LONG 0
  88.  
  89. /* The new routine which will replace the original library function */
  90. newf:
  91.   MOVEM.L D0-D7/A0-A6, -(A7)
  92.   LEA store(PC), A4
  93.   MOVE.L (A4), A4 /* Reinstate the A4 register so we can use E code */
  94.   sendmsg()
  95.   MOVEM.L (A7)+, D0-D7/A0-A6
  96.   MOVE.L patch(PC), -(A7)
  97.   RTS
  98.